#include <iostream>
#include <regex>
#include <string>

// 测试正则库表达式使用
void use_regex_test() {
  std::string str("helloWorld!123456");
  std::smatch smch;
  std::regex rex("helloWorld!(\\d+)");

  std::regex_match(str, smch, rex);
  for (auto it : smch) {
    std::cout << it << std::endl;
  }
}

// 读取HTTP请求行
void regex_getRequest() {
  // HTTP请求报文GET /index.html?user=xiaoming&pass=123123 HTTP/1.1\r\n
  std::string str("GET /index.html?user=zhangsan&pass=123456 HTTP/1.1\r\n");
  std::smatch smch;
  std::regex rex("(GET|POST|HEAD|PUT|DELETE) "
                 "([^?]*)(?:\\?(.*))? "
                 "(HTTP/1\\.[01])(?:\n|\r\n)?");
  // GET|HEAD|POST|PUT|DELETE   表示匹配并提取其中任意一个字符串
  //[^?]*     [^?]匹配非问号字符， 后边的*表示0次或多次
  //\\?(.*)   \\?  表示原始的？字符
  //(.*)表示提取?之后的任意字符0次或多次，知道遇到空格 HTTP/1\\.[01]
  // 表示匹配以HTTP/1.开始，后边有个0或1的字符串
  //(?:\n|\r\n)?   （?: ...） 表示匹配某个格式字符串，但是不提取，
  // 最后的？表示的是匹配前边的表达式0次或1次

  std::regex_match(str, smch, rex);
  for (auto it : smch) {
    std::cout << "[" << it << "]" << std::endl;
  }
}

int main() {
  regex_getRequest();
  return 0;
}